home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-046 < prev    next >
Text File  |  1995-12-31  |  84KB  |  2,285 lines

  1. Received-Date: Wed, 20 Jul 1994 14:41:28 +0200
  2. From: pottier@clipper.ens.fr (Francois Pottier)
  3. Subject: csmp-digest-v3-046
  4. To: csmp-digest@ens.fr
  5. Date: Wed, 20 Jul 1994 14:41:25 +0200 (MET DST)
  6. X-Mailer: ELM [version 2.4 PL23]
  7. Mime-Version: 1.0
  8. Content-Type: text/plain; charset=ISO-8859-1
  9. Content-Transfer-Encoding: 8bit
  10. Errors-To: listman@ens.fr
  11. Reply-To: pottier@clipper.ens.fr
  12. X-Sequence: 49
  13.  
  14. C.S.M.P. Digest             Wed, 20 Jul 94       Volume 3 : Issue 46
  15.  
  16. Today's Topics:
  17.  
  18.         3D Rotational examples - Help wanted
  19.         CASE Tools for Macintosh
  20.         Debugging an applet properly (AppleScript)
  21.         GWorlds vs. Offscreens
  22.         GWorlds: When to lock pixels?
  23.         How do you write TIFFs?
  24.         How to tell Energy Saver to turn the monitor on or off
  25.         Newbie Gworld questions.
  26.         Patching Trap ExitToShell using UniversalProcPtr's
  27.         Porting from Unix to Mac - Summary
  28.         Problems with Metrowerks vs. MPW 68k C calling conventions
  29.         Special #define for Univ. Hdrs?
  30.         Why does THINK C use a jump table?
  31.  
  32.  
  33.  
  34. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  35. (pottier@clipper.ens.fr).
  36.  
  37. The digest is a collection of article threads from the internet newsgroup
  38. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  39. regularly and want an archive of the discussions.  If you don't know what a
  40. newsgroup is, you probably don't have access to it.  Ask your systems
  41. administrator(s) for details.  If you don't have access to news, you may
  42. still be able to post messages to the group by using a mail server like
  43. anon.penet.fi (mail help@anon.penet.fi for more information).
  44.  
  45. Each issue of the digest contains one or more sets of articles (called
  46. threads), with each set corresponding to a 'discussion' of a particular
  47. subject.  The articles are not edited; all articles included in this digest
  48. are in their original posted form (as received by our news server at
  49. nef.ens.fr).  Article threads are not added to the digest until the last
  50. article added to the thread is at least two weeks old (this is to ensure that
  51. the thread is dead before adding it to the digest).  Article threads that
  52. consist of only one message are generally not included in the digest.
  53.  
  54. The digest is officially distributed by two means, by email and ftp.
  55.  
  56. If you want to receive the digest by mail, send email to listserv@ens.fr
  57. with no subject and one of the following commands as body:
  58.     help                        Sends you a summary of commands
  59.     subscribe csmp-digest Your Name    Adds you to the mailing list
  60.     signoff csmp-digest            Removes you from the list
  61. Once you have subscribed, you will automatically receive each new
  62. issue as it is created.
  63.  
  64. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  65. Questions related to the ftp site should be directed to
  66. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  67. digest are available there.
  68.  
  69. Also, the digests are available to WAIS users.  To search back issues
  70. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  71. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  72.  
  73.  
  74. -------------------------------------------------------
  75.  
  76. >From Malicious_Monarch@nile.com (Malicious Monarch)
  77. Subject: 3D Rotational examples - Help wanted
  78. Date: Tue,  5 Jul 94 14:39:38 MDT
  79. Organization: The Nile BBS
  80.  
  81.      I'm looking for some examples in creating simple three dimensional objects
  82. in C.  I've just started reading Michael Chen's article in issue 14 of develop,
  83. but I imagine there are some references to explain the use of the Graf3D library
  84. and perhaps even some more simplistic code to give a basic understanding of
  85. creating and drawing three dimensional objects.
  86.  
  87.      Please understand that I'm not concerned with a user interface at this
  88. point, just simple rendering code (ie making a cube and rotating it to give the
  89. illusion that it is a three dimensional object).  If someone could point toward
  90. some source code, or any literature (books, magazines, etc.) I would really
  91. really appreciate it.  Thanks...
  92.  
  93.  
  94. -Eric A. Drumbor-
  95.  
  96.      Opinions posted are of the user, not the administration.
  97.  
  98. +++++++++++++++++++++++++++
  99.  
  100. >From nick@pitt.edu ( nick.c )
  101. Date: Tue, 5 Jul 94 17:58:41 GMT
  102. Organization: University of Pittsburgh
  103.  
  104. In Article <0007E5C6.fc@nile.com>, Malicious_Monarch@nile.com (Malicious
  105. Monarch) wrote:
  106.  
  107. >     Please understand that I'm not concerned with a user interface at this
  108. >point, just simple rendering code (ie making a cube and rotating it to give the
  109. >illusion that it is a three dimensional object).  If someone could point toward
  110. >some source code, or any literature (books, magazines, etc.) I would really
  111. >really appreciate it.  Thanks...
  112.  
  113.   There is some code called "wireframeorama" (or something like that)
  114.     that's at both sumex and umich.  A couple of good books are:
  115.  
  116.    _Computer_Graphics_ 2nd ed by Hearn & Baker ISBN 0-13-161530-0
  117.  
  118.    _3D_Computer_Graphics_ 2nd ed by Alan Watt  ISBN 0-201-63186-5
  119.  
  120.   One general procedure is to imagine your "object" in 3D space 
  121.     (say with x,y,z co-ords centered around 0,0,0 to start),
  122.     then imagine an "observer" in the same space (say at x,y,z=0,0,100)
  123.     and a perpandicular plane between them (say at z= 70).
  124.  
  125.   Rotate, translate or do whatever to the object (working in cartesian it's
  126.     pretty easy - it's also handy to add a fourth parameter as a scaler
  127.     for xy&z - say t) then imagine vectors from the observer to each
  128.     point of your object (say the vertices of the cube).  The points
  129.     where your vectors intersect the plane are the points you want
  130.     to map to your graphics port.  Then just connect the dots in your
  131.     graphics port.  With wire frame, you don't have to worry 'bout 
  132.     which point is closer to the observer. 
  133.  
  134.   Hmmm... not the best explanation, but I'm kind of new to this too.
  135.     Check out those books (or anything around T385 in your library), 
  136.     it's a lot easier than it seems at first.  Luck,
  137.  
  138.                                             -- nick
  139.  
  140.  
  141.     
  142.  
  143.  
  144.    _/   _/  _/  _/_/_/   _/   _/  Sea Shells to C shells,  Waikiki to
  145.   _/_/ _/  _/  _/   _/  _/_/_/     the Internet, a wave, is a wave...
  146.  _/ _/_/  _/  _/       _/ _/
  147. _/   _/  _/   _/_/_/  _/   _/  CompSrv: 71232,766 I-Net: Nick@pitt.edu
  148.  
  149.  
  150. +++++++++++++++++++++++++++
  151.  
  152. >From cconstan@epdiv1.env.gov.bc.ca (Carl B. Constantine)
  153. Date: Wed, 06 Jul 1994 07:40:20 -0700
  154. Organization: Ministry of Environment, Lands & Parks
  155.  
  156. In article <nick.1123818761C@usenet.pitt.edu>, nick@pitt.edu ( nick.c ) wrote:
  157.  
  158. > In Article <0007E5C6.fc@nile.com>, Malicious_Monarch@nile.com (Malicious
  159. > Monarch) wrote:
  160. > >     Please understand that I'm not concerned with a user interface at this
  161. > >point, just simple rendering code (ie making a cube and rotating it to
  162. give the
  163. > >illusion that it is a three dimensional object).  If someone could
  164. point toward
  165. > >some source code, or any literature (books, magazines, etc.) I would really
  166. > >really appreciate it.  Thanks...
  167. >   There is some code called "wireframeorama" (or something like that)
  168. >     that's at both sumex and umich.  A couple of good books are:
  169.  
  170. [ snip ]
  171.  
  172. I have a good file (better than wireframeorama) that uses the Graph3D
  173. library and rotates and scales (I think) an object in 3D space.
  174.  
  175. e-mail me if you're interested.  I may post it (it's small)
  176.  
  177. -- 
  178. ========================================================================
  179. Carl B. Constantine                  B.C. Environment, Lands & Parks
  180. End-User Support Analyst             CCONSTAN@epdiv1.env.gov.bc.ca
  181.  PGP Key available if you finger: CCONSTAN@EUSACBC.env.gov.bc.ca
  182.  
  183. +++++++++++++++++++++++++++
  184.  
  185. >From kenlong@netcom.com (Ken Long)
  186. Date: Wed, 6 Jul 1994 15:32:47 GMT
  187. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  188.  
  189. On devtools.symantec.com there's a file called 3DGraphics (something like 
  190. that) which is a port to C from the old Lisa Pascal "Boxes" and 
  191. "BoxSpheres" programs sources.  Uses the Graf3D lib.
  192.  
  193. There are some rotaters on alt.sources.mac's home site.  One is a color 
  194. Graf3D thing written by jjcii@aol.com, as a learning tool for Graf3D.  
  195. One is a revival of some old code called "ROT-PSIG" in the snippets as 
  196. rotpsig2.  Lots of comments in this file, on the whole rotation thing 
  197. (non-Graf3D).
  198.  
  199. I've got 3 Pascal source (the C port doesn't run yet) for 
  200. rotating/animating 3D spheres and geometric shapes.  One came from AOL 
  201. and one from the CUMUG files.  Icosahedron6 is the latter.  Both use 
  202. "light sources" and thus shading.
  203.  
  204. -Ken-
  205.  
  206. ---------------------------
  207.  
  208. >From white@cs.sfu.ca (Steve &)
  209. Subject: CASE Tools for Macintosh
  210. Date: 29 Jun 1994 20:16:59 GMT
  211. Organization: Department of Mathematics and Statistics, Simon Fraser University
  212.  
  213. I've been looking into CASE tools for use with the Mac, and from a run
  214. through several issues of the Journal of Object Oriented Programming (JOOP)
  215. and Object Magazine (OM); I've found four.
  216.  
  217. This is a pretty crappy summary of what I found, but I hope to add to it.
  218.  
  219. If you know of or sell any others, please let me know and I'll post a better
  220. summary.  I'd quite like to hear of any experiences you have had with
  221. any Mac CASE tool, or of any review articles in MacUser or Mac World.
  222.  
  223. Cheers!
  224. ______________________________________________________________________________
  225. Vendor    Berard Software     Excel software  Iconix Software   Object Inter-
  226.           Engineering Inc                     Engineering       national, Inc
  227.  
  228. Tool      The Berard Object   MacAnalyist,    ObjectModeler     ObjecTool
  229.           and Class Specifier MacDesigner
  230.  
  231. Method    Berard, &c          ?               Rumb, &c          ?
  232.  
  233. platform  Mac "this summer",  Mac             Mac, others soon  all(!)
  234.           Win, OS/2
  235.           
  236. advert    p34 OM Sep 93       p45 OM Sep 93   p8 OM Dec 93      p6 OM Sept 93
  237.  
  238. review    p85 OM Sep 93                       p98 OM Nov 92     p94 JOOP v6#3
  239.  
  240. price $US 595                                                   995
  241.  
  242. code gen? Y                                                     Y
  243.  
  244. +++++++++++++++++++++++++++
  245.  
  246. >From nbhatia@netcom.com (Naresh Bhatia)
  247. Date: Sat, 2 Jul 1994 19:31:53 GMT
  248. Organization: MultiQuest Corporation
  249.  
  250. Steve & (white@cs.sfu.ca) wrote:
  251. : I've been looking into CASE tools for use with the Mac, and from a run
  252. : through several issues of the Journal of Object Oriented Programming (JOOP)
  253. : and Object Magazine (OM); I've found four.
  254.  
  255. : If you know of or sell any others, please let me know and I'll post a better
  256. : summary.
  257.  
  258. MultiQuest Corporation offers an object-oriented tool, called S-CASE, 
  259. that implements the Booch method. The Mac version is $249. I am attaching 
  260. a short summary for your information.
  261.  
  262. Naresh Bhatia
  263. MultiQuest Corporation
  264.  
  265.  
  266. S-CASE  is  a  multi-user  software  engineering  tool that supports the
  267. Booch method  of object-oriented  design. The  product allows developers
  268. to create models of their systems using graphical tools that  understand
  269. the  semantics  of  the  Booch  methodology.  C++  code can be generated
  270. automatically from  these models.  S-CASE is  one of  the first tools of
  271. its kind  to operate  on heterogeneous  networks of  PC, Macintosh,  and
  272. UNIX workstations.
  273.  
  274. S-CASE allows developers to experiment with many design approaches. High
  275. level designs  can be  created quickly  and later  refined by filling in
  276. details about class methods and attributes.
  277.  
  278. The tool's C++ code generation  encourages engineers to spend more  time
  279. in the critical analysis and  design phases and spend less  time writing
  280. code. C++  headers and  method stubs  are generated  directly from class
  281. diagrams. The engineer simply fills in the body of the methods.
  282.  
  283. S-CASE lets you  conduct on-line interactive  design reviews. Ideas  are
  284. quickly conveyed to colleagues and customers through concise full  color
  285. diagrams. Presentation  quality output  provides hard  copy handouts and
  286. documentation.
  287.  
  288. S-CASE stores data in a platform independent format allowing  multi-user
  289. access across different platforms.
  290.  
  291. Available immediately, S-CASE lists at:
  292.            $249  MS Windows and Macintosh
  293.            $995  Sun SPARC and HP 9000
  294.            (floating and site licenses also available)
  295.  
  296. Demos can be downloaded via  anonymous ftp at ftp.netcom.com. The  demos
  297. are under /pub/showcase.
  298.  
  299. The  Microsoft  Windows  demo  is  also  available  on CompuServe in the
  300. CASEFORUM. The demo is named  "showcase.zip" and is located in  the CASE
  301. library.
  302.  
  303. For further information please contact:
  304.  
  305.               ------------------------------------------
  306.                         MultiQuest Corporation
  307.                   1699 East Woodfield Road, Suite A-1
  308.                        Schaumburg, IL 60173, USA
  309.  
  310.                           Tel: (708) 240-5555
  311.                           Fax: (708) 240-5556
  312.                    Email: 72531.2510@compuserve.com
  313.               ------------------------------------------
  314.  
  315.  
  316. +++++++++++++++++++++++++++
  317.  
  318. >From Lars.Farm@nts.mh.se (Lars Farm)
  319. Date: Mon, 04 Jul 1994 08:38:06 +0100
  320. Organization: Mid Sweden University
  321.  
  322. In article <nbhatiaCsBvL5.HF0@netcom.com>, nbhatia@netcom.com (Naresh
  323. Bhatia) wrote:
  324.  
  325. > Steve & (white@cs.sfu.ca) wrote:
  326. > : I've been looking into CASE tools for use with the Mac, and from a run
  327. > : through several issues of the Journal of Object Oriented Programming (JOOP)
  328. > : and Object Magazine (OM); I've found four.
  329. > : If you know of or sell any others, please let me know and I'll post a better
  330. > : summary.
  331. > MultiQuest Corporation offers an object-oriented tool, called S-CASE, 
  332. > that implements the Booch method.
  333.  
  334. S-CASE? So they changed the name? I know it as Showcase and it is nice. Has
  335. editors for (new) Booch class diagrams and (new) Booch object interaction
  336. diagrams. Quite useful and usable! (even though the "crossplatform" nature
  337. shines through in some details.)
  338.  
  339. Lars
  340.  
  341. -- 
  342. Lars.Farm@nts.mh.se
  343.  
  344. ---------------------------
  345.  
  346. >From boris@world.std.com (Boris Levitin)
  347. Subject: Debugging an applet properly (AppleScript)
  348. Date: Tue, 5 Jul 1994 11:41:58 GMT
  349. Organization: The World @ Software Tool & Die
  350.  
  351. I'm writing a large AppleScript applet, and have two problems:
  352.  
  353. 1. I need to have a reliable way to refer to the applet's own
  354. parent folder, because that's where I store some configuration
  355. files the applet uses (I don't want to hardcode the path).
  356. "path to me" returns the path to the applet only when it's running
  357. as an applet. When it's run from inside Script Editor, "me" is
  358. interpreted to be Script Editor -- not the desirable effect. I'm
  359. tired of having to hardcode in a path every time I need to debug
  360. the applet; is there any way to say, path to this very script file?
  361.  
  362. 2. I have a large idle handler in my applet, and there doesn't seem
  363. to be a way to have Script Editor send an idle message to the applet
  364. when it's being debugged in it. Consequently, I have to comment out
  365. the on idle and end idle statements every time I debug. It's annoying,
  366. like item 1.
  367.  
  368. I would appreciate any suggestions.
  369.  
  370.  
  371. -- 
  372. Boris Levitin                                  WGBH Public Broadcasting, Boston
  373.                                    boris@world.std.com * boris_levitin@wgbh.org
  374.  
  375. +++++++++++++++++++++++++++
  376.  
  377. >From Jens Alfke <jens_alfke@powertalk.apple.com>
  378. Date: Wed, 6 Jul 1994 16:22:59 GMT
  379. Organization: Apple Computer
  380.  
  381. Boris Levitin, boris@world.std.com writes:
  382. > "path to me" returns the path to the applet only when it's running
  383. > as an applet. When it's run from inside Script Editor, "me" is
  384. > interpreted to be Script Editor -- not the desirable effect. I'm
  385. > tired of having to hardcode in a path every time I need to debug
  386. > the applet; is there any way to say, path to this very script file?
  387.  
  388. Nope. AppleScript has no idea where the script it's executing is stored.
  389.  
  390. > 2. I have a large idle handler in my applet, and there doesn't seem
  391. > to be a way to have Script Editor send an idle message to the applet
  392. > when it's being debugged in it.
  393.  
  394. Not unless you explicitly say "idle" in your main body or 'on run' handler.
  395. The runtime environment of an applet is different than one being run by the
  396. editor, so it wouldn't really make sense for a script to be sent idle events
  397. while in the editor.
  398.  
  399. These things have both annoyed me too. But I couldn't think of a clean
  400. solution that didn't involve major reworking of the way scripts are edited in
  401. AS 1.X.
  402.  
  403. --Jens Alfke
  404.   jens_alfke@powertalk              Rebel girl, rebel girl,
  405.             .apple.com              Rebel girl you are the queen of my world
  406.  
  407. +++++++++++++++++++++++++++
  408.  
  409. >From jwbaxter@olympus.net (John W. Baxter)
  410. Date: Wed, 06 Jul 1994 12:19:45 -0700
  411. Organization: Internet for the Olympic Peninsula
  412.  
  413. In article <CsGttz.4o9@world.std.com>, boris@world.std.com (Boris Levitin)
  414. wrote:
  415.  
  416. > I'm writing a large AppleScript applet, and have two problems:
  417. > 1. I need to have a reliable way to refer to the applet's own
  418. > parent folder, because that's where I store some configuration
  419. > files the applet uses (I don't want to hardcode the path).
  420. > "path to me" returns the path to the applet only when it's running
  421. > as an applet. When it's run from inside Script Editor, "me" is
  422. > interpreted to be Script Editor -- not the desirable effect. I'm
  423. > tired of having to hardcode in a path every time I need to debug
  424. > the applet; is there any way to say, path to this very script file?
  425. >
  426. > 2. I have a large idle handler in my applet, and there doesn't seem
  427. > to be a way to have Script Editor send an idle message to the applet
  428. > when it's being debugged in it. Consequently, I have to comment out
  429. > the on idle and end idle statements every time I debug. It's annoying,
  430. > like item 1.
  431.  
  432. You might give Script Wizard a try (there is a demo [can't save scripts]
  433. version available at
  434.  
  435.   ftp://gaea.kgs.ukans.edu:applescript/demos/ScriptWiz.Demo.sit.hqx
  436.  
  437. (there's a press release "beside" the demo file in the same directory).
  438.  
  439. Note that I say "try":  I don't know whether "they" addressed the idle
  440. question or not.  Script Wizard is one of two OSA script editors recently
  441. announced, to fill the high-end of the editing services spectrum (it is
  442. said that Apple intentionally left that end open for third parties).  The
  443. other one isn't quite out yet.
  444.  
  445. Meanwhile...for debugging, I'd hard-code a path.  When the path to me
  446. returns a path to the Script Editor, have the run handler pass your action
  447. code the hard-coded path...otherwise have it pass the result from path to
  448. me.  Just remember not to give your script editor a clever name which
  449. breaks your test.
  450.    if (path to me) contains "Script Editor" then ...
  451.  
  452. --John
  453.  
  454. -- 
  455. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  456.    No hablo Intel.
  457.    jwbaxter@pt.olympus.net
  458.  
  459. ---------------------------
  460.  
  461. >From hoyer@cc.Helsinki.FI (P. Hoyer)
  462. Subject: GWorlds vs. Offscreens
  463. Date: 18 Jun 1994 02:03:40 +0300
  464. Organization: University of Helsinki
  465.  
  466. Once again, Hello netters!
  467.  
  468. Since it's almost 2 A.M. here in Finland and I'm waiting for the Spain
  469. vs. South-Korea soccer game to begin, I thought I'd ask a question that
  470. has long been on my mind.
  471.  
  472. I've been using regular old-style offscreen grafports (both 8-bit and
  473. b&w) for a few years now, and since I have reusable code to create these
  474. offscreens, I've never taken the trouble to really find out how GWorlds
  475. differ from these offscreens. Since I don't own the latest in Inside
  476. Macs, I can't look it up there.
  477.  
  478. So, what are the advantages of GWorlds? Is there really any reason to
  479. switch from offscreen grafports? I guess the main argument would be
  480. "they're easier to use" but since I already have working routines
  481. offscreens aren't a problem for me.
  482.  
  483. If this message is a bit unclear, it's only 'cause it's 02:04 in the
  484. morning and I'm tired as hell... :)
  485.  
  486. -P. Hoyer <hoyer@cc.helsinki.fi>
  487.  
  488. +++++++++++++++++++++++++++
  489.  
  490. >From Mark Hanrek <hanrek@cts.com>
  491. Date: Sat, 18 Jun 1994 13:08:48 GMT
  492. Organization: The Information Workshop
  493.  
  494. In article <2tta4c$585@kruuna.Helsinki.FI> P. Hoyer, hoyer@cc.Helsinki.FI
  495. writes:
  496.  
  497. > So, what are the advantages of GWorlds? Is there really any reason to
  498. > switch from offscreen grafports? I guess the main argument would be
  499. > "they're easier to use" but since I already have working routines
  500. > offscreens aren't a problem for me.
  501.  
  502. Well, as they say, "if it ain't broke, don't fix it".  If you are having
  503. good luck, then by all means don't change unless you need to.
  504.  
  505.  
  506. The advantages of GWorlds that come to mind include...
  507.  
  508. * Apple is responsible for the source code, not me. :)
  509.   ( this is my favorite advantage :)
  510.  
  511. * One simple call handles the creation of an entire GWorld, 
  512.   which includes the pixmap, grafport, and graphic device,
  513.   and color table.
  514.  
  515. * GWorlds handle aligning themselves with destination screen.
  516.  
  517. * Passing 0 for the bit depth causes GWorlds to pick up the 
  518.   attributes of the screen containing the majority of the 
  519.   passed global rectangle, automatically.
  520.  
  521. * After you create the GWorld, there are calls to conveniently 
  522.   obtain the pixmapHandle so you can lock it
  523.  
  524. * A single call (UpdateGWorld) will do whatever is necessary to 
  525.   ensure that the GWorld is totally optimized for fastest transfer
  526.   to the screen, including aligning its pixels with the screen's,
  527.   and making sure the source and destination color tables match.
  528.  
  529. * Pixels can be purged and restored, and also cached on a NuBus card
  530.   based graphics accelerator transparently.
  531.  
  532. There may be more advantages.
  533.  
  534.  
  535. The benefit of GWorlds handling and hiding all of the concerns 
  536. of graphic devices has allowed me to have the confidence that my
  537. software will work on any screen out there, and I didn't have to
  538. learn a single thing about the internals of graphic devices!
  539.  
  540. But as I say, the best part is that Apple maintains the code.
  541.  
  542. I am totally certain that there is at least one thing in their
  543. code that I would have never figured out.  :)
  544.  
  545. But also, if your's works fine, don't change it unless you must.
  546.  
  547. Spend your time, instead, on your struggle to get your palettes and
  548. color tables working properly.  :)
  549.  
  550. - ---------
  551.  
  552. When it comes to Palettes and Color Tables, there IS a big need
  553. for some help in this area.  There are almost no examples, and
  554. Forest Tanaka mentioned once that there won't be much new
  555. in this area, if anything, in Quickdraw/GX.
  556.  
  557. It took me days and days of trying every combination and permutation
  558. to zero in on what I am supposed to do, so that I am a courteous guy
  559. with respect to other applications and their color needs.  These 
  560. "interapplication issues" are not documented, nor is there example
  561. source code that has everything working together, and I have 
  562. scoured the earth in search of some.
  563.  
  564. BTW, in one's update event handler, you can include a call to
  565. UpdateGWorld.  If everything is fine, then it returns immediately.
  566.  
  567. If, however, the user moved into the background, and now the other 
  568. app's color table is in control, or the user changed the bit depth,
  569. then UpdateGWorld will either handle the situation for you ( and
  570. there will be a slight delay ) or you will get the signal that
  571. you must redraw your graphics into the GWorld because the user
  572. increased the bit depth ( since the color detail was lost when the
  573. user decreased the bit depth ).
  574.  
  575. Ensuring the color tables match has a BIG impact on performance. The
  576. difference is easily perceptible.
  577.  
  578. If you put a call to UpdateGWorld whenever the window is moved or
  579. resized, then you can rest assured your pixels will be automatically
  580. realigned, if necessary, for optimum performance as well.
  581.  
  582.  
  583. Hope this helps.
  584.  
  585. Mark Hanrek
  586.  
  587. +++++++++++++++++++++++++++
  588.  
  589. >From hoyer@cc.Helsinki.FI (P. Hoyer)
  590. Date: 18 Jun 1994 22:09:43 +0300
  591. Organization: University of Helsinki
  592.  
  593. >
  594. > But as I say, the best part is that Apple maintains the code.
  595. >
  596.  
  597. So what you essentially mean is that GWorlds are less likely to break
  598. when Apple decides to move stuff around and change stuff? This seems
  599. like a good reason to switch sooner or later...
  600.  
  601. >
  602. > But also, if your's works fine, don't change it unless you must.
  603. >  
  604. > Spend your time, instead, on your struggle to get your palettes and
  605. > color tables working properly.  :)
  606.  
  607. Well, since I've mostly written simple games which use the System
  608. palette, I haven't had to worry about colors really. Now, I'm making a
  609. little more serious game that will probably need a custom
  610. palette...hmmm, I think I ought to get some example code on GWorlds.
  611. Would anybody happen to have any good sample code?
  612.  
  613. I read about the Palette Manager in IM V (it's the latest I've got). Has
  614. it evolved much since the days of the MacII? ;)
  615.  
  616. -P. Hoyer <hoyer@cc.helsinki.fi>
  617.  
  618. +++++++++++++++++++++++++++
  619.  
  620. >From Mark Hanrek <hanrek@cts.com>
  621. Date: Sat, 18 Jun 1994 23:24:18 GMT
  622. Organization: The Information Workshop
  623.  
  624. In article <2tvgpn$ror@kruuna.Helsinki.FI> P. Hoyer, hoyer@cc.Helsinki.FI
  625. writes:
  626.  
  627. > I read about the Palette Manager in IM V (it's the latest I've got).
  628. > Has it evolved much since the days of the MacII? ;)
  629.  
  630. Not much. I think there are were some updating options added.
  631.  
  632.  
  633. As for examples, there are tons of them.  You will want to download files
  634. you find in the development source code areas of umich and sumex, in
  635. addition to ftp.apple.com.
  636.  
  637. DTS.lib is also an excellent reference.
  638.  
  639. Also, there are lots of examples all over the Developer CD, and a must
  640. have article is "Drawing in GWorlds for Speed and Versatility" from the
  641. May '92 issue of develop (includes source code).
  642.  
  643. Also, I have learned a lot from GMonde, and ResetColors, both by Forest
  644. Tanaka.
  645.  
  646. Hope this helps.
  647.  
  648. Mark Hanrek
  649.  
  650. +++++++++++++++++++++++++++
  651.  
  652. >From ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University)
  653. Date: 21 Jun 94 14:16:17 +1200
  654. Organization: University of Waikato, Hamilton, New Zealand
  655.  
  656. In article <CrLGIq.FFM@crash.cts.com>, Mark Hanrek <hanrek@cts.com> writes:
  657. >
  658. > The advantages of GWorlds that come to mind include...
  659. (lots of good ones omitted).
  660.  
  661. It is true. GWorlds take care of 90% of your needs. As one who started messing
  662. about with Color QuickDraw on one of the first Mac II's to hit New Zealand
  663. (back in 1987), it is *much* less fiddly to use GWorlds than to try to create
  664. your own GDevices.
  665.  
  666. However, there are a few things you can't do with GWorlds. For a start, you
  667. can't create a GWorld that does its drawing into a pre-existing pixmap.
  668.  
  669. In deference to my current enthusiasms, I should point out that the
  670. offscreen support in QuickDraw GX doesn't suffer from this problem. :-)
  671.  
  672. Lawrence D'Oliveiro                       fone: +64-7-856-2889
  673. Info & Tech Services Division              fax: +64-7-838-4066
  674. University of Waikato            electric mail: ldo@waikato.ac.nz
  675. Hamilton, New Zealand    37^ 47' 26" S, 175^ 19' 7" E, GMT+12:00
  676.  
  677. +++++++++++++++++++++++++++
  678.  
  679. >From Alex Kac <akac@delphi.com>
  680. Date: Fri, 1 Jul 94 23:33:06 -0500
  681. Organization: Delphi (info@delphi.com email, 800-695-4005 voice)
  682.  
  683. See if you can get the MacTech magazine from (I think...), April and May which
  684. have a complete tutorial on using GWorlds...
  685.  
  686. ---------------------------
  687.  
  688. >From Gordon Graber <gg4921s@Acad.Drake.Edu>
  689. Subject: GWorlds: When to lock pixels?
  690. Date: 6 Jul 1994 13:14:55 GMT
  691. Organization: Drake University
  692.  
  693. How Do All,
  694. Several questions about locking a GWorlds pixels:
  695. 1.  Must you lock the pixels to the GWorld if you have specified
  696. NoPurgePixels for the GWorld?
  697. 2.  If drawing and copyBitsing between several GWorlds in a loop, can one
  698. lock the pixels for each GWorld before the start of the loop and then
  699. unlock them after the loop is done executing?
  700. 3.  If you knew you were going to access several GWorlds often in a
  701. program, why not lock the pixels at the outset and unlock them when the
  702. program ends?
  703. 3a.  If this results in some kind of memory fragmentation, is there a way
  704. of optimizing this? ( like moveHi(); Lock(); ?)
  705. 4.  Why do you not have to lock the pixels to the main screen, or do you?
  706. 5.  Are there any conditions, possible exceptions above, under which one
  707. does not need to lock the pixels?
  708.  
  709. Thanks for any help,
  710.   Gordon Graber:  gg4921s@acad.drake.edu
  711.  
  712. +++++++++++++++++++++++++++
  713.  
  714. >From ctaylor@fox.nstn.ns.ca (Christian Taylor)
  715. Date: 6 Jul 1994 11:31:40 -0300
  716. Organization: Nova Scotia Technology Network
  717.  
  718. As far as I know, you should always lock the pixels when you're drawing. 
  719. Most drawing commands are safe and don't move memory, but things like
  720. PlotIcon do, and you'll lock up the computer if you leave the pixels
  721. unlocked.  When I create a GWrold, I usually lock the pixels right after
  722. and the unlock them in my de-init routine.
  723.  
  724. Christian
  725.  
  726.  
  727. +---------------------+----------------------------------+
  728. |  Christian Taylor   | Internet: ctaylor@fox.nstn.ns.ca |
  729. |The Party Palace BBS | CIS     : 71442,1161             |
  730. |   (902) 679-1218    | AOL     : Chris1020              |
  731. +---------------------+----------------------------------+
  732.  
  733. +++++++++++++++++++++++++++
  734.  
  735. >From al@crucible.powertools.com (Al Evans)
  736. Date: 6 Jul 94 14:35:09 GMT
  737. Organization: PowerTools, Austin, Texas
  738.  
  739. In article <2veaof$ru@dunix.drake.edu> gg4921s@Acad.Drake.Edu (Gordon Graber) writes:
  740.  
  741. >Several questions about locking a GWorlds pixels:
  742.  
  743. >1.  Must you lock the pixels to the GWorld if you have specified
  744. >NoPurgePixels for the GWorld?
  745.  
  746. Yes. NoPurgePixels simply keeps the pixels in memory. It doesn't keep
  747. them from moving. Incidentally, pixels are non-purgeable by default --
  748. unless you've made them purgeable on creation or later, they'll stay
  749. around.
  750.  
  751. >2.  If drawing and copyBitsing between several GWorlds in a loop, can one
  752. >lock the pixels for each GWorld before the start of the loop and then
  753. >unlock them after the loop is done executing?
  754.  
  755. Yes, unless memory is really tight and/or there is a lot of allocation
  756. and deallocation within the loop in question. 
  757.  
  758. >3.  If you knew you were going to access several GWorlds often in a
  759. >program, why not lock the pixels at the outset and unlock them when the
  760. >program ends?
  761.  
  762. Unless memory is really tight and/or (et cetera), this is a good thing
  763. to do. To the extent that you can do so, allocate all the memory you'll
  764. need at startup, and lock it down.
  765.  
  766. >3a.  If this results in some kind of memory fragmentation, is there a way
  767. >of optimizing this? ( like moveHi(); Lock(); ?)
  768.  
  769. I don't know whether this is "guaranteed", but in my experience
  770. LockPixels() already does a MoveHi().
  771.  
  772. >4.  Why do you not have to lock the pixels to the main screen, or do you?
  773.  
  774. Because they can't move. Even if you physically move your monitor, the
  775. graphics memory for that monitor stays in the same place:-)
  776.  
  777. >5.  Are there any conditions, possible exceptions above, under which one
  778. >does not need to lock the pixels?
  779.  
  780. You don't need to lock them if 1) you are operating on them entirely
  781. from within your own code, without calling ToolBox routines, and 2)
  782. if you don't do any memory allocation/deallocation from within that
  783. code. They will stay where they are unless there's a reason for them
  784. to move.
  785.                     --Al Evans--
  786. -- 
  787. Al Evans            |   Graphic Elements: A new standard for 
  788.                 |   high-performance interactive Macintosh graphics.
  789. al@crucible.powertools.com  |   Available from mac.archive.umich.edu
  790.                 |   /mac/misc/demo/graphicelementsdemo.sit.hqx
  791.  
  792. +++++++++++++++++++++++++++
  793.  
  794. >From Mark Hanrek <hanrek@cts.com>
  795. Date: Wed, 6 Jul 1994 15:33:56 GMT
  796. Organization: The Information Workshop
  797.  
  798. In article <454@crucible.powertools.com> Al Evans,
  799. al@crucible.powertools.com writes:
  800.  
  801. >>4. Why do you not have to lock the pixels to the main screen ?
  802. >
  803. > Because they can't move. Even if you physically move your monitor, the
  804. > graphics memory for that monitor stays in the same place :-)
  805. >
  806.  
  807. Al,
  808.  
  809. You crack me up! :) :) :)
  810.  
  811. Mark
  812.  
  813. ---------------------------
  814.  
  815. >From tfullert@bottom.magnus.acs.ohio-state.edu (tfullert)
  816. Subject: How do you write TIFFs?
  817. Date: 6 Jul 1994 17:32:44 GMT
  818. Organization: The Ohio State University
  819.  
  820. Greetings:
  821.  
  822. I am developing an application where I must export graphics as TIFFs. 
  823. Does any free source exist for this exist?  Where might I find it?
  824.  
  825. Thanks.
  826.  
  827. Tim
  828.  
  829. +++++++++++++++++++++++++++
  830.  
  831. >From Mark Hanrek <hanrek@cts.com>
  832. Date: Thu, 7 Jul 1994 01:47:33 GMT
  833. Organization: The Information Workshop
  834.  
  835. Subject: How do you write TIFFs?
  836. From: tfullert, tfullert@bottom.magnus.acs.ohio-state.edu
  837. Date: 6 Jul 1994 17:32:44 GMT
  838. In article <2veprs$gh2@charm.magnus.acs.ohio-state.edu> tfullert,
  839. tfullert@bottom.magnus.acs.ohio-state.edu writes:
  840.  
  841. > Greetings:
  842. >
  843. > I am developing an application where I must export graphics as TIFFs. 
  844. > Does any free source exist for this exist?  Where might I find it?
  845. >
  846. > Thanks.
  847. >
  848. > Tim
  849.  
  850.  
  851. Tim,
  852.  
  853. I suggest you use Archie, because it will easily pull up trillions of
  854. places where TIFF source code can be found.  This is usually a package by
  855. Sam Leffler for unix systems.
  856.  
  857. Also, the URT (Utah Raster Toolkit) has TIFF writing code. ( University
  858. of Utah :).
  859.  
  860. A package called MegaTIFF can be found on AppleLink ( I think that is Sam
  861. Leffler's package kinda ported to MPW ).
  862.  
  863. You will also want to look on CompuServe, which is where the "Aldus
  864. Developer Desk" lives, and example source code can be found there, in
  865. addition to the test suite of TIFF pictures.
  866.  
  867. You will also want to definitely have your own copy of the TIFF 6.0
  868. Specification.  Get it and print it from the PostScript formatted
  869. version.  It is a beautiful and well-written document that will clarify
  870. many things for you. ( wierd, huh? :)
  871.  
  872. This document can be found on umich, and possibly sumex.
  873.  
  874. The other things I can think of only decode TIFF, and I've mentioned all
  875. the good stuff anyway.
  876.  
  877.  
  878. Hope this helps.
  879.  
  880. Mark Hanrek
  881.  
  882. +++++++++++++++++++++++++++
  883.  
  884. >From rgc3679@halcyon.com (Bob Carpenter)
  885. Date: Wed, 06 Jul 1994 20:34:28 -0800
  886. Organization: Northwest Nexus Inc.
  887.  
  888. In article <2veprs$gh2@charm.magnus.acs.ohio-state.edu>,
  889. tfullert@bottom.magnus.acs.ohio-state.edu (tfullert) wrote:
  890.  
  891. > Greetings:
  892. > I am developing an application where I must export graphics as TIFFs. 
  893. > Does any free source exist for this exist?  Where might I find it?
  894.   At SGI's anonymous ftp sit (ftp.sgi.com) in directory: graphics/tiff
  895.   you'll find much information and source code for working with TIFFs.
  896.   You'll also find the latest version of the TIFF specification (6).
  897.  
  898.   You may also want to subscribe to the tiff mailing list by sending
  899.   the word subscribe in the body of a message to:
  900.  
  901.     majordomo@whizzer.wpd.sgi.com
  902.  
  903. -- 
  904. --BobC
  905.  
  906. ---------------------------
  907.  
  908. >From tzs@u.washington.edu (Tim Smith)
  909. Subject: How to tell Energy Saver to turn the monitor on or off
  910. Date: 4 Jul 1994 13:35:09 GMT
  911. Organization: University of Washington School of Law, Class of '95
  912.  
  913. A few months ago, I spent a while disassembling Apple's Energy Saver
  914. control panel to figure out how it worked.  I needed to know this
  915. because I wanted to make it work for me under A/UX.  That effort was
  916. a success, allowing me to create an extension, Energy Beaver, that
  917. loads before Energy Saver under A/UX, and diddles a few things so
  918. that Energy Saver will be happy.  (Energy Beaver, plus source code,
  919. is available on ftp.u.washington.edu, in public/tzs, if anyone wants
  920. it).
  921.  
  922. A couple of weeks ago, someone asked me via email how one interfaces
  923. to Energy Saver.  They wanted to add Energy Saver support to a screen
  924. saver they were working on.  It occured to me that this might be of
  925. interest to others, so I decided to post a copy of my response here.
  926. That is appended at the end of this post.
  927.  
  928. Apple's Energy Saver actually consists of three components.  A
  929. driver that patches into the video driver and actually does the
  930. hardware manipulation (this driver is contained in an INIT
  931. resource, so you won't find a DRVR in the Energy Saver file),
  932. an INIT that is basically a screen saver that calls the driver
  933. when it is time to blank the screen or unblank it, and a CDEV
  934. that provides the interface.  When you turn Energy Saver off
  935. from the CDEV, all you are really doing is telling the screen
  936. saver INIT to turn off.  The driver is still active, and can
  937. be called from other software to turn the monitor off and on.
  938.  
  939. - --------- copy of letter follows --------
  940.  
  941. Hello;
  942.  
  943.     I've looked at the Energy Saver disassembly, and done a little
  944. experimenting.  Here's the information you need, I think.
  945.  
  946. 1. Determining if Energy Saver supports a particular video card.
  947.  
  948. Issue a status call to the driver, with csCode=11, and csParam containing
  949. a pointer to a data area of 6 bytes.  I don't think it matters what you
  950. place in this data area, but Apple places zeros there, so I'd do that
  951. too.  If this control call does not return an error, then the Energy
  952. Saver driver is installed for that monitor.
  953.  
  954. 2. To enter Energy Saving mode.
  955.  
  956. Step through the graphics device list.  For each device, determine if
  957. Energy Saver is installed for that device using that above test.  For
  958. each that it is, do a control call with csCode=11 (that's decimal 11,
  959. not hex 11), and csParam containing a pointer to a data area of six
  960. bytes.  In that six bytes, place the following: 0x01, 0x01, 'H', 'A',
  961. 'L', ' '.
  962.  
  963. 3. To exit Energy Saving mode.
  964.  
  965. This is similar to entering Energy Saving mode, except that those first
  966. two bytes of the six byte data area should be 0x00 and 0x00 instead of
  967. 0x01 and 0x01.
  968.  
  969. After you've turned everything on, for each monitor do a status call
  970. with csCode=11, and csParam containing a pointer to six bytes of data.
  971. Fill out that data area with 0x00, 0x00, 'H', 'A', 'L', ' ' before
  972. doing the call.  After the status call, check byte 1 of the six byte
  973. data area (numbered from 0).  If that byte ANDed with 0x80 is non-zero,
  974. then do the following:
  975.  
  976.         short temp = (*g)->gdMode & 0xffff;
  977.         (*g)->gdMode = 0;
  978.         SetDepth(g,temp,0,0);
  979.  
  980. where g is a handle to the GDevice record for the monitor.
  981.  
  982. After you've set the depth on all the monitors that need it, call
  983. DrawMenuBar.
  984.  
  985. 4. Some observations.
  986.  
  987. I don't think it matters whether or not the 'HAL ' stuff is placed in
  988. the six byte data area in the control and status calls.  I didn't
  989. notice anything that checked for this in the driver that handles these
  990. calls when I disassembled them.
  991.  
  992. Energy Saving mode seems to scramble some of the VRAM.  When it comes
  993. out of Energy Saving mode, there are random colored pixels scattered
  994. around.  That business with SetDepth seems to be to get everyone to
  995. update the screen.  If you are doing this from a screen saver, presumably
  996. you will already be making everyone redraw, so you probably don't need
  997. this.
  998.  
  999. The status call seems to modify the first two bytes of the six byte data
  1000. area pointed to be csParam.  I do not know what the significance of byte 1
  1001. is, other than it seems to contain that flag that tells if the monitor
  1002. needs to have the screen redrawn to clean up the garbage.  Byte 0 seems
  1003. to get written with 0x00 if the monitor is not in Energy Saving mode,
  1004. and 0xFF if it is.  Apple's software does not seem to make use of this,
  1005. so it is not clear that it is safe to rely on it.
  1006.  
  1007. 5. Sample code.
  1008.  
  1009. Here is a simple program fragment that enters Energy Saving mode, waits for
  1010. a mouse click, and then leaves Energy Saving mode.
  1011.  
  1012.  
  1013.     CntrlParam    c;
  1014.     GDHandle    g;
  1015.     OSErr        e;
  1016.     short        res[3];        // the six byte data area
  1017.     
  1018.     //
  1019.     // We'll just do the first screen
  1020.     //
  1021.     g = GetDeviceList();
  1022.     
  1023.     c.ioCRefNum = (*g)->gdRefNum;
  1024.     c.csCode = 11;
  1025.     res[0] = 0; res[1] = 0; res[2] = 0;
  1026.     *(short **)(&c.csParam[0]) = &res[0];
  1027.     c.ioCompletion = 0;
  1028.     e = PBStatus( (ParmBlkPtr)&c, 0 );
  1029.     if ( e )
  1030.     {
  1031.         cout << "Energy Saver not supported!" << endl;
  1032.         return;
  1033.     }
  1034.  
  1035.     //
  1036.     // Turn monitor off
  1037.     //
  1038.     c.ioCRefNum = (*g)->gdRefNum;
  1039.     c.csCode = 11;
  1040.     res[0] = 0x0101; res[1] = 'HA'; res[2] = 'L ';
  1041.     *(short **)(&c.csParam[0]) = &res[0];
  1042.     c.ioCompletion = 0;
  1043.     e = PBControl( (ParmBlkPtr)&c, 0 );
  1044.     
  1045.     //
  1046.     // Pause until the mouse is clicked
  1047.     //
  1048.     while ( ! Button() )
  1049.         ;
  1050.     while ( Button() )
  1051.         ;
  1052.  
  1053.     //
  1054.     // Turn monitor back on
  1055.     //
  1056.     c.ioCRefNum = (*g)->gdRefNum;
  1057.     c.csCode = 11;
  1058.     res[0] = 0x0000; res[1] = 'HA'; res[2] = 'L ';
  1059.     *(short **)(&c.csParam[0]) = &res[0];
  1060.     c.ioCompletion = 0;
  1061.     e = PBControl( (ParmBlkPtr)&c, 0 );
  1062.     
  1063.     //
  1064.     // See if we need to set the depth to clean up the garbage
  1065.     //
  1066.     c.ioCRefNum = (*g)->gdRefNum;
  1067.     c.csCode = 11;
  1068.     res[0] = 0; res[1] = 'HA'; res[2] = 'L ';
  1069.     *(short **)(&c.csParam[0]) = &res[0];
  1070.     c.ioCompletion = 0;
  1071.     e = PBStatus( (ParmBlkPtr)&c, 0 );
  1072.     
  1073.     if ( res[0] & 0x0080 )
  1074.     {
  1075.         short temp = (*g)->gdMode & 0xffff;
  1076.  
  1077.         (*g)->gdMode = 0;
  1078.         SetDepth(g,temp, 0, 0 );
  1079.     }
  1080.     
  1081.  
  1082. ---------------------------
  1083.  
  1084. >From altitude@umich.edu (Alex Tang)
  1085. Subject: Newbie Gworld questions.
  1086. Date: 3 Jul 1994 14:11:22 GMT
  1087. Organization: University of Michigan
  1088.  
  1089. Hi folks.  I've got some pretty newbie'ish questions about Gworlds...
  1090.  
  1091. First, i haven't been able to find a good explaination about what they're
  1092. used for.  From the various bits of info that I've picked up, they
  1093. comprise of a lot of different graphics devices and tools (i.e. offscreen
  1094. drawing).  Is that right?  Is the main purpose for them so that offscreen
  1095. drawing is easier?
  1096.  
  1097. The main reason i'm asking is that I'm trying to write a small,
  1098. rudamentary graphics app.  It's something to teach me how to do
  1099. mac programming.  Basically, it's supposed be able to open some windows,
  1100. do some drawing into the wndows, and save the file as a PICT.  I've hit a
  1101. minor roadblock trying to figure out how where to draw the stuff and be
  1102. able to do updates on it.  At first, I thought I could draw directly to
  1103. the window, but that didn't work.  I'm trying to figure out if i need to
  1104. use gworlds for this (and i guess i should learn about them anyway).  
  1105.  
  1106. Well, Thanx for any insight that is provided.
  1107.  
  1108. ...alex...
  1109.  
  1110. --
  1111.     Alex Tang      |     UM-SNRE     |       UM-ITD/US Consultant II
  1112. ALTITUDE@UMICH.EDU |     Student     | http://www.snre.umich.edu/~altitude
  1113.   PGP via finger.  |  Systems Admin  | "Life's a game.  
  1114. This space for rent| Comp.Consut III |  play for fun, and play with Honor."
  1115.  
  1116. +++++++++++++++++++++++++++
  1117.  
  1118. >From gurgle@netcom.com (Pete Gontier)
  1119. Date: Mon, 4 Jul 1994 01:06:54 GMT
  1120. Organization: cellular
  1121.  
  1122. altitude@umich.edu (Alex Tang) writes:
  1123.  
  1124. >Is the main purpose for (GWorlds) so that offscreen drawing is easier?
  1125. >The main reason i'm asking is that I'm trying to write a small,
  1126. >rudamentary graphics app. ...it's supposed be able to open some
  1127. >windows, do some drawing into the wndows, and save the file as a PICT.
  1128.  
  1129. The question should be then, whether this drawing is going to require
  1130. you to use CopyBits. CopyBits is the routine used to shove bit maps and
  1131. pixel maps around in memory, on-screen and off-screen and in between
  1132. the two. You need it only if you need to do some image processing which
  1133. occurs as a side-effect of calls to CopyBits (colorizing bitmaps,
  1134. dithering, blending pixel maps, etc.) *or* you're trying to do some
  1135. updating which needs to be smooth or animated.
  1136.  
  1137. If the answer to this sort of question is "no", then don't bother with
  1138. GWorlds. Stick with Pictures. They're easier to deal with and they can
  1139. be translated almost directly into PICT files (such files are 512 bytes
  1140. of 0 followed by the contents of a PicHandle).
  1141.  
  1142. >I've hit a minor roadblock trying to figure out how where to draw the
  1143. >stuff and be able to do updates on it. At first, I thought I could draw
  1144. >directly to the window, but that didn't work...
  1145.  
  1146. Yes, and I understand the problem. Pictures will allow you to get around
  1147. this quite nicely, and in general in less memory than GWorlds, too.
  1148.  
  1149. Happy reading!
  1150. -- 
  1151.  Pete Gontier, CTO, Integer Poet Software; gurgle@netcom.com
  1152.  
  1153.  "...someone not acquainted with the Christian mythology of the
  1154.  Crucifixion might consider a Crucifix to be a particularly sadistic
  1155.  piece of erotica... We of the ACLU will continue to defend your right to
  1156.  worship such objects if it pleases you." -- Gregory J. Wageman
  1157.  
  1158. +++++++++++++++++++++++++++
  1159.  
  1160. >From Mark Hanrek <hanrek@cts.com>
  1161. Date: Mon, 4 Jul 1994 21:03:07 GMT
  1162. Organization: The Information Workshop
  1163.  
  1164. In article <2v6gua$62j@lastactionhero.rs.itd.umich.edu> Alex Tang,
  1165. altitude@umich.edu writes:
  1166.  
  1167. > Hi folks.  I've got some pretty newbie'ish questions about Gworlds...
  1168. >
  1169. > First, i haven't been able to find a good explaination about what
  1170. they're
  1171. > used for.  From the various bits of info that I've picked up, they
  1172. > comprise of a lot of different graphics devices and tools (i.e.
  1173. offscreen
  1174. > drawing).  Is that right?  Is the main purpose for them so that
  1175. offscreen
  1176. > drawing is easier?
  1177. >
  1178. > The main reason i'm asking is that I'm trying to write a small,
  1179. > rudamentary graphics app.  It's something to teach me how to do
  1180. > mac programming.  Basically, it's supposed be able to open some windows,
  1181. > do some drawing into the wndows, and save the file as a PICT.  I've hit
  1182. a
  1183. > minor roadblock trying to figure out how where to draw the stuff and be
  1184. > able to do updates on it.  At first, I thought I could draw directly to
  1185. > the window, but that didn't work.  I'm trying to figure out if i need to
  1186. > use gworlds for this (and i guess i should learn about them anyway).  
  1187. >
  1188. > Well, Thanx for any insight that is provided.
  1189. >
  1190. > ...alex...
  1191.  
  1192.  
  1193. Alex,
  1194.  
  1195. Here is the answer to all of your questions at once.  It is the answer
  1196. you were looking for...
  1197.  
  1198. As an illustrative example, let's say your application has one window
  1199. which contains an XY bar graph of some data you have.  This graph would,
  1200. of course, have the XY lines, the tick marks, the numbers for the tick
  1201. marks, the titles, the data bars, etc, all made up of a series of
  1202. QuickDraw calls, such as MoveTo, LineTo, FrameRect, PaintRect,
  1203. DrawString, etc.
  1204.  
  1205.  
  1206. - --- Setting up your application
  1207.  
  1208. All "imaging" for this window should happen ONLY in response to the
  1209. "update" event that is sent to this window.  Period.  Your update event
  1210. handler should look something like this...
  1211.  
  1212.   void DoUpdateEvent( WindowPtr  theWindow )
  1213.   {
  1214.      BeginUpdate( theWindow );
  1215.      DrawWindowContents( theWindow );
  1216.      EndUpdate( theWindow );
  1217.   }
  1218.  
  1219. The routine "DrawWindowContents" should draw EVERYTHING that appears in
  1220. your window whenever it is called regardless.  This is the correct thing
  1221. to do.  A window should always start life this way.  Do NOT put any calls
  1222. to draw this window anywhere else in your software.  No exceptions.
  1223.  
  1224. When the window is created, an update event will automatically be sent to
  1225. it. Convenient. 
  1226.  
  1227. And if there is some reason you need to update a certain area of your
  1228. window (and the system didn't ask you to), you can do this by
  1229. "invalidating" the desired area of your window, by calling InvalRect().
  1230. This triggers an update event to have that area of the window "cleaned
  1231. up".
  1232.  
  1233. In your update event handler, you must use the BeginUpdate and EndUpdate
  1234. calls, allowing you to take advantage of the Window Manager, which keeps
  1235. track of which part of your window actually needs to be re-drawn. ( The
  1236. update region ).
  1237.  
  1238. Your DrawWindowContents() routine will blindly draw everything to this
  1239. window, but the OS will automatically cut short any QuickDraw calls that
  1240. draw to areas of the window that do not actually need updating.
  1241.  
  1242. Even with this automatic built-in optimization, if you have a very
  1243. complex drawing, you will find that updating the window can be sluggish,
  1244. and you can see all the individual elements being re-drawn, as you do can
  1245. in, say, a complex MacDraw or Canvas drawing.
  1246.  
  1247. This is where GWorlds come in handy...
  1248.  
  1249.  
  1250. - --- Incremental Improvement #1
  1251.  
  1252. In response to the update event, create a GWorld the same size as your
  1253. window, draw the whole image into the GWorld instead, and then draw the
  1254. entire GWorld to the window all at once using CopyBits, then dispose of
  1255. the GWorld. 
  1256.  
  1257. This makes it so the user does not see all the individual elements being
  1258. redrawn.
  1259.  
  1260. This is what happens when you do a "lock screen" then an "unlock screen"
  1261. in HyperCard.
  1262.  
  1263. This does not, however, eliminate the time it takes to draw all the
  1264. individual elements. If you were to, say, move another window that
  1265. overlaps the bar graph window by just one pixel, an update event would,
  1266. of course, be sent to your bar graph window, and it would spend the time
  1267. redrawing the scores of things that make up the image.  To help optimize
  1268. that, we can take the usage of our GWorld a step further...
  1269.  
  1270.  
  1271. - --- Incremental Improvement #2
  1272.  
  1273. When you create your window for the first time, also create a GWorld the
  1274. same size as your window, and have DrawWindowContents() draw its image
  1275. into the GWorld instead, once only, to "prep" the GWorld.
  1276.  
  1277. Then from that point on, in response to an update event, simply use
  1278. CopyBits to transfer the ENTIRE GWorld to the entire window.  The Window
  1279. Manager will only allow the needed areas to actually be transferred, and
  1280. you will now have the most efficient and optimal way of handling the
  1281. imaging of window contents.
  1282.  
  1283. Your window updating will now be instantaneous, and there will be no
  1284. sluggishness.
  1285.  
  1286. When you close the window, dispose of the GWorld too.
  1287.  
  1288.  
  1289. - --- Important Note
  1290.  
  1291. This explanation is a lot like putting you in a row boat and giving you a
  1292. starting push in the direction of that little reef offshore you want to
  1293. get to.  
  1294.  
  1295. You do not need to know all about boats, all about the ocean, and all
  1296. about propulsion in order to make it to that little reef successfully. 
  1297. You also do not need to know at this time how to handle things
  1298. differently if you were hypothetically put in an outrigger instead.
  1299.  
  1300. Don't allow yourself or others to unnecessarily complicate things.  Take
  1301. this simple push and go with it, and you will quickly "get it".
  1302.  
  1303.  
  1304. - --- Following Advice
  1305.  
  1306. Mark my words.  If you put drawing-to-window code anywhere else than in
  1307. your update handler, you will find that a good chunk of your code, and
  1308. the time it took to develop it, ends up being spent on compensating for
  1309. the problems and side-effects that were created as a result of not
  1310. following this sage advice.
  1311.  
  1312. I made this mistake myself when I first started, and paid a hefty price
  1313. for it, too.  Hopefully you can avoid the waste of repeating this common
  1314. (and undocumented) programming error.
  1315.  
  1316.  
  1317. Hope this helps!
  1318.  
  1319. Mark Hanrek
  1320. The Information Workshop
  1321.  
  1322.  
  1323. - ----------------------------------
  1324.  
  1325. P.S.  The other undocumented programming error waiting to eat you is
  1326. mixing the use of GetPort/SetPort and GetGWorld/SetGWorld in the same
  1327. application.  
  1328.  
  1329. The minute you start working with GWorlds, eliminate all uses of
  1330. GetPort/SetPort from your application, changing them all to the more
  1331. modern GetGWorld/SetGWorld.
  1332.  
  1333. Ouch!
  1334.  
  1335. +++++++++++++++++++++++++++
  1336.  
  1337. >From kenlong@netcom.com (Ken Long)
  1338. Date: Tue, 5 Jul 1994 17:04:15 GMT
  1339. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1340.  
  1341. For more reading on GWorlds, get "Programming QuickDraw" by Surovell, 
  1342. Hall and Othmer.
  1343.  
  1344. For an example of an application comparison WITHOUT and WITH GWorlds 
  1345. (GWorld added by Mark Hanrek) get NuCube and NewCube C source demos. (I 
  1346. believe they are on sumex, in a file called "ThreePointPlotters" or 
  1347. "WireFrameORama").
  1348.  
  1349. There are excellent, comprehenhive examples of GWorld C sources on 
  1350. ftp.apple.com (GWorld Drawing - not an app. source, but several routines) 
  1351. and "GWorlds" from devtools.symantec.com - source for a complete application.
  1352.  
  1353. Of course, there are many more, too.  cicnAnimDemo uses GWorlds.
  1354.  
  1355. I was told, by a downloader of NuCude (which Mark contributed to), that 
  1356. he really gained a lot of understanding of them from the source.  Well, 
  1357. Mark understands them - that's why.
  1358.  
  1359. -Ken-
  1360.  
  1361. ---------------------------
  1362.  
  1363. >From brewster@enc.org (Dave Brewster)
  1364. Subject: Patching Trap ExitToShell using UniversalProcPtr's
  1365. Date: 5 Jul 1994 01:38:45 -0400
  1366. Organization: Eisenhower National Clearinghouse
  1367.  
  1368. How does one go about doing this on the PPC.  I've tried:
  1369.    SetToolTrapAddress(MyExitToShellUPP, _ExitToShell);
  1370. where MyExitToShellUPP = 
  1371.    NewRoutineDescriptor((ProcPtr)(MyExitToShell), kCStackBased,
  1372. GetCurrentISA());
  1373.  
  1374. I figured this would be correct, but it dies a violent death!
  1375.  
  1376. Is the kCStackBased parameter wrong?  My routine doesn't take any
  1377. parameters so I'm not or'ing this with anything.  Oh yea, and it doesn't
  1378. return anything either.
  1379.  
  1380. My ExitToShell routine looks like:
  1381.  
  1382. void MyExitToShell (void)
  1383. {
  1384.    SetCurrentA5();
  1385.    SetToolTrapAddress(gOldExitToShellTrapAddress, _ExitToShell);
  1386.    EndNNTP();
  1387.    NetTerm();
  1388.    ExitToShell();
  1389. }
  1390.  
  1391. What's the deal,
  1392.  
  1393. Dave
  1394.  
  1395. +++++++++++++++++++++++++++
  1396.  
  1397. >From stevec@jolt.mpx.com.au (Stephen F Coy)
  1398. Date: 5 Jul 1994 13:52:33 GMT
  1399. Organization: Microplex Pty Ltd
  1400.  
  1401. Dave Brewster (brewster@enc.org) wrote:
  1402. : How does one go about doing this on the PPC.  I've tried:
  1403. :    SetToolTrapAddress(MyExitToShellUPP, _ExitToShell);
  1404. : where MyExitToShellUPP = 
  1405. :    NewRoutineDescriptor((ProcPtr)(MyExitToShell), kCStackBased,
  1406. : GetCurrentISA());
  1407.  
  1408. : I figured this would be correct, but it dies a violent death!
  1409.  
  1410. : Is the kCStackBased parameter wrong?  My routine doesn't take any
  1411. : parameters so I'm not or'ing this with anything.  Oh yea, and it doesn't
  1412. : return anything either.
  1413.  
  1414. : My ExitToShell routine looks like:
  1415.  
  1416. : void MyExitToShell (void)
  1417. : {
  1418. :    SetCurrentA5();
  1419. :    SetToolTrapAddress(gOldExitToShellTrapAddress, _ExitToShell);
  1420. :    EndNNTP();
  1421. :    NetTerm();
  1422. :    ExitToShell();
  1423. : }
  1424.  
  1425. If you use the standard C library function "atexit" instead you would not 
  1426. have to worry about all this stuff.
  1427.  
  1428. In general, you should avoid patching traps. Most of the time it is 
  1429. not necessary.
  1430.  
  1431.  
  1432.  : What's the deal,
  1433.  
  1434. : Dave
  1435.  
  1436. Steve Coy
  1437. Resolve Software (WA) P/L
  1438.  
  1439.  
  1440. +++++++++++++++++++++++++++
  1441.  
  1442. >From wdh@netcom.com (Bill Hofmann)
  1443. Date: Tue, 5 Jul 1994 16:11:42 GMT
  1444. Organization: Fresh Software
  1445.  
  1446. In article <199407050538.FAA08919@charm.magnus.acs.ohio-state.edu>,
  1447. brewster@enc.org (Dave Brewster) wrote:
  1448.  
  1449. > How does one go about doing this on the PPC.  I've tried:
  1450. >    SetToolTrapAddress(MyExitToShellUPP, _ExitToShell);
  1451. > where MyExitToShellUPP = 
  1452. >    NewRoutineDescriptor((ProcPtr)(MyExitToShell), kCStackBased,
  1453. > GetCurrentISA());
  1454. > I figured this would be correct, but it dies a violent death!
  1455. > Is the kCStackBased parameter wrong?  My routine doesn't take any
  1456. > parameters so I'm not or'ing this with anything.  Oh yea, and it doesn't
  1457. > return anything either.
  1458. > My ExitToShell routine looks like:
  1459. > void MyExitToShell (void)
  1460. > {
  1461. >    SetCurrentA5();
  1462. >    SetToolTrapAddress(gOldExitToShellTrapAddress, _ExitToShell);
  1463. >    EndNNTP();
  1464. >    NetTerm();
  1465. >    ExitToShell();
  1466. > }
  1467. Well, with few exceptions, the entire toolbox is either kPascalStackBased
  1468. or kRegisterBased.  So you have two (well, 1.5) problems:
  1469.  
  1470. MyExitToShellUPP = NewRoutineDescriptor((ProcPtr)MyExitToShell,
  1471.                         kPascalStackBased, GetCurrentISA());
  1472. ...
  1473. pascal void MyExitToShell(void)
  1474. {
  1475. ...
  1476. }
  1477.  
  1478. I say 1.5 because a pascal void ... (void) is pretty much the same as a
  1479. void ... (void), but better to be compulsive than sorry.  I assume that
  1480. you init gOldExitToShellTrapAddress.  Does your code (minus the
  1481. NewRoutineDescriptor()) work on 040 machines?
  1482.  
  1483. -- 
  1484. Bill Hofmann                                   wdh@netcom.com
  1485. Fresh Software and Instructional Design        voice: +1 510 524 0852
  1486. 1640 San Pablo Ave #C, Berkeley CA 94702 USA   fax:   +1 510 524 0853
  1487.  
  1488. +++++++++++++++++++++++++++
  1489.  
  1490. >From kbell@cs.utexas.edu (Kevin Bell)
  1491. Date: Tue, 05 Jul 1994 18:34:35 -0600
  1492. Organization: The University of Texas at Austin, Austin, Texas
  1493.  
  1494. In article <199407050538.FAA08919@charm.magnus.acs.ohio-state.edu>,
  1495. brewster@enc.org (Dave Brewster) wrote:
  1496.  
  1497. > How does one go about doing this on the PPC.  I've tried:
  1498. >    SetToolTrapAddress(MyExitToShellUPP, _ExitToShell);
  1499. > where MyExitToShellUPP = 
  1500. >    NewRoutineDescriptor((ProcPtr)(MyExitToShell), kCStackBased,
  1501. > GetCurrentISA());
  1502. > I figured this would be correct, but it dies a violent death!
  1503. > Is the kCStackBased parameter wrong?  My routine doesn't take any
  1504. > parameters so I'm not or'ing this with anything.  Oh yea, and it doesn't
  1505. > return anything either.
  1506. > My ExitToShell routine looks like:
  1507. > void MyExitToShell (void)
  1508. > {
  1509. >    SetCurrentA5();
  1510. >    SetToolTrapAddress(gOldExitToShellTrapAddress, _ExitToShell);
  1511. >    EndNNTP();
  1512. >    NetTerm();
  1513. >    ExitToShell();
  1514. > }
  1515. > What's the deal,
  1516. > Dave
  1517.  
  1518. Here's the code I used to do the same thing
  1519.  
  1520. // KMB: ExitToShell UPP Info
  1521.  
  1522. static UniversalProcPtr gOldExitToShellTrapAddress;
  1523.  
  1524. enum {
  1525.     exitToShellProcInfo = kPascalStackBased
  1526. };
  1527.  
  1528. static void PatchExitToShell (void)
  1529. {
  1530.     UniversalProcPtr MyExitToShellUPP =
  1531.         NewRoutineDescriptor((ProcPtr)MyExitToShell,
  1532.                          exitToShellProcInfo,
  1533.                          GetCurrentISA());
  1534.     gOldExitToShellTrapAddress = GetToolTrapAddress(_ExitToShell);
  1535.     SetToolTrapAddress(MyExitToShellUPP, _ExitToShell);
  1536. }
  1537.  
  1538.  
  1539.     BTW, thanks for asking this question. When I tried to open the source
  1540. code with my PowerMac compiled NewsWatcher, I discovered some errors with
  1541. my standard file UPP stuff. IMHO, universal procedure pointers have a
  1542. serious problem in that the compiler cannot do any type checking like it
  1543. could for regular function pointers. In my case, I was creating a
  1544. FileFilterUPP where a ModalFilterUPP was needed.
  1545.  
  1546. -- 
  1547. Kevin Bell
  1548. kbell@cs.utexas.edu
  1549.  
  1550. ---------------------------
  1551.  
  1552. >From gtodorov@ralph.cs.haverford.edu (Gordan Todorovac)
  1553. Subject: Porting from Unix to Mac - Summary
  1554. Date: 1 Jul 1994 17:29:34 GMT
  1555. Organization: Haverford College Computer Science Department
  1556.  
  1557. Thanks to all who replied. Here is the content of three replies which summarize
  1558. what was said:
  1559.  
  1560.  
  1561. >From millsp@gov.on.ca Fri Jul  1 07:22:10 1994
  1562.  
  1563.   I haven't used version 5 for a year or more, but I'm quite sure that
  1564. malloc was available...#include <stdlib.h> and add the ANSI library to
  1565. your project certainly works in v6 and its not something new I've added
  1566. during the upgrade.
  1567.  
  1568.   If you're looking to move away from Unix-isms, there are Toolbox
  1569. calls, NewPtr and DisposPtr, for memory management.
  1570.  
  1571.   (I've done a few small ports of things that started on Unix.  My major
  1572. problems have been trying to understand library calls that don't exist
  1573. and don't seem to have matching concepts on the Mac...fork?
  1574. yfork?...but most of them should be there.)
  1575.  
  1576.  
  1577. >From gardner@osm7.cs.byu.edu Fri Jul  1 10:32:54 1994
  1578.  
  1579. I port code from the Unix to the Mac and from the Mac to Unix all the time 
  1580. (and to the PC in between).  The main thing to keep in mind is *not* to use
  1581. UNIXisms or MACisms (or PCisms).  If you program in strictly ANSI C, you
  1582. will 
  1583. not have a problem going either direction.  Now that does eliminate taking 
  1584. advantage of platform specific features.  But thats actually what
  1585. portability 
  1586. is all about.  
  1587.  
  1588. As for malloc, include stdlib.h for the prototype and add ANSI to your
  1589. project and you are all set.  Note:  THINK C gives you a set of unix-like
  1590. functions 
  1591. in unix.h that help you compile *some* code containing some UNIXisms. 
  1592. However, 
  1593. most do not implement the semantics/behavior of the unix function (mostly
  1594. because they have no MAC equivalent).  I would not use them except as a
  1595. last 
  1596. resort.
  1597.  
  1598.  
  1599. >From VCHAVARR@samnet.jsc.nasa.gov Fri Jul  1 11:27:52 1994
  1600.  
  1601. One of the biggest differences between Mac and Unix systems is the way the 
  1602. operating system allocates memory. Unix uses pointers, Macs use handles, 
  1603. which are pointers to pointers. The malloc function tells the Unix system to 
  1604. allocate a certain amount of memory and returns a pointer to it. Macs use a 
  1605. function called NewHandle to allocate a block of memory, and a handle is 
  1606. returned.
  1607.  
  1608. There is a Mac function called NewPtr (in the memory.h file, I believe), 
  1609. which allocates a block of memory and returns a pointer to it. Allocating 
  1610. memory on a Mac with pointers, however, can be a bad idea because memory 
  1611. segmentation can occur, especially if you are allocating a lot of memory. 
  1612. You could replace all of the mallocs in your code with NewPtr, if you're not 
  1613. worried about memory segmentation. This has the advantage of you not having 
  1614. to make changes to your code in the parts where pointers are referenced. If 
  1615. you use NewHandle to replace malloc, however, you will have to go and find 
  1616. all of the places where pointers are referenced and make some changes.
  1617.  
  1618. Another area of difference between Unix and Macs are in the functions which 
  1619. are used to handle files. You can expect problems in this area if your Unix 
  1620. program reads or writes files.
  1621.  
  1622. - -------------------------------
  1623. --Gordan
  1624.  
  1625.  
  1626. ---------------------------
  1627.  
  1628. >From rick@akbar.cc.utexas.edu (Rick Watson)
  1629. Subject: Problems with Metrowerks vs. MPW 68k C calling conventions
  1630. Date: 29 Jun 1994 18:43:25 GMT
  1631. Organization: The University of Texas at Austin, Austin, Texas
  1632.  
  1633. Metrowerks 68k C passes short values on the stack as 16-bit
  1634. values where MPW uses 32 bits. This causes problems when trying
  1635. to call MPW generated code modules, including MacTCP's 
  1636. domain resolver code called by DNR.c. 
  1637.  
  1638. Is there an easy workaround for this that does NOT involve prototyping
  1639. the short values as longs? 
  1640.  
  1641. Rick Watson 
  1642. The University of Texas Computation Center, Networking Services, 512/471-8220
  1643.  r.watson@utexas.edu
  1644.  
  1645. +++++++++++++++++++++++++++
  1646.  
  1647. >From edandavi@well.sf.ca.us (Ed Allen and Avi Rappoport)
  1648. Date: 29 Jun 1994 22:47:27 GMT
  1649. Organization: The Whole Earth 'Lectronic Link, Sausalito, CA
  1650.  
  1651. rick@akbar.cc.utexas.edu (Rick Watson) writes:
  1652.  
  1653. >Metrowerks 68k C passes short values on the stack as 16-bit
  1654. >values where MPW uses 32 bits. This causes problems when trying
  1655. >to call MPW generated code modules, including MacTCP's 
  1656. >domain resolver code called by DNR.c. 
  1657.  
  1658. >Is there an easy workaround for this that does NOT involve prototyping
  1659. >the short values as longs? 
  1660.  
  1661. Nope, there is no easy workaround.  Pascal libraries are fine, but C 
  1662. libraries have different parameter passing conventions, as you note 
  1663. above.  If you can get the source, compile it in MW.
  1664.  
  1665. Sorry.
  1666.  
  1667. -- 
  1668. Avi Rappoport                         (account also used by Ed Allen)
  1669. Systems Analyst and Technical Diplomat
  1670. metrowerks, Inc.
  1671. Please reply to: avirr@metrowerks.ca  avirr@aol.com  avirr@eworld.com
  1672.  
  1673. +++++++++++++++++++++++++++
  1674.  
  1675. >From mwron@aol.com (MW Ron)
  1676. Date: 29 Jun 1994 17:35:04 -0400
  1677. Organization: America Online, Inc. (1-800-827-6364)
  1678.  
  1679. In article <2usfcd$55p@geraldo.cc.utexas.edu>,
  1680. rick@akbar.cc.utexas.edu (Rick Watson) writes:
  1681.  
  1682. >>Metrowerks 68k C passes short values on the stack as 16-bit
  1683. values where MPW uses 32 bits.
  1684. Is there an easy workaround for this that does NOT involve
  1685. prototyping
  1686. the short values as longs? 
  1687.  
  1688. Did you change the structure allignment in your preferences Processor
  1689. for 4 byte int and 8 byte doubles,  and use the proper Libraries? I
  1690. am not an MPW user so if this isn't the fix, please reply.
  1691.  
  1692. Ron Liechty
  1693. mwron@aol.com
  1694. Metrowerks Inc.
  1695.  
  1696.  
  1697. +++++++++++++++++++++++++++
  1698.  
  1699. >From johnmce@world.std.com (John McEnerney)
  1700. Date: Thu, 30 Jun 1994 05:42:45 GMT
  1701. Organization: The World Public Access UNIX, Brookline, MA
  1702.  
  1703. rick@akbar.cc.utexas.edu (Rick Watson) writes:
  1704.  
  1705. >Metrowerks 68k C passes short values on the stack as 16-bit
  1706. >values where MPW uses 32 bits. This causes problems when trying
  1707. >to call MPW generated code modules, including MacTCP's 
  1708. >domain resolver code called by DNR.c. 
  1709.  
  1710. The problem is that although you may declare an argument 'short' or 
  1711. 'char' in MPW C, it will pass it as 32-bits. This was common in K&R 
  1712. compilers but is rare in ANSI compilers (THINK C does it the same way 
  1713. that we do)
  1714.  
  1715. The trick is to fool CW by declaring all integer arguments as 'long' in 
  1716. the prototype (including enums). Then the arguments will be properly 
  1717. extended to 32-bits.
  1718.  
  1719. -- John McEnerney, Metrowerks PowerPC Product Architect
  1720.  
  1721.  
  1722. +++++++++++++++++++++++++++
  1723.  
  1724. >From creiman@netcom.com (Charlie Reiman)
  1725. Date: Fri, 1 Jul 1994 05:36:05 GMT
  1726. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1727.  
  1728. mwron@aol.com (MW Ron) writes:
  1729.  
  1730. >In article <2usfcd$55p@geraldo.cc.utexas.edu>,
  1731. >rick@akbar.cc.utexas.edu (Rick Watson) writes:
  1732.  
  1733. >>>Metrowerks 68k C passes short values on the stack as 16-bit
  1734. >values where MPW uses 32 bits.
  1735. >Is there an easy workaround for this that does NOT involve
  1736. >prototyping
  1737. >the short values as longs? 
  1738.  
  1739. >Did you change the structure allignment in your preferences Processor
  1740. >for 4 byte int and 8 byte doubles,  and use the proper Libraries? I
  1741. >am not an MPW user so if this isn't the fix, please reply.
  1742.  
  1743. >Ron Liechty
  1744. >mwron@aol.com
  1745. >Metrowerks Inc.
  1746.  
  1747. Think C has the exact same feature, even with 4 byte ints turned on.  I
  1748. did call up Symantec tech support and argue about this. I can no longer
  1749. quote the K&R ANSI page number, but the behavior you are seeing is not
  1750. incorrect.
  1751.  
  1752. It's stupid, but not incorrect. 
  1753.  
  1754. You need prototypes under Think, MW may have another solution.
  1755.  
  1756. -- 
  1757. "You can't cancel the project! We already made the T-shirts!"
  1758. Charlie Reiman
  1759. creiman@netcom.com
  1760.  
  1761. +++++++++++++++++++++++++++
  1762.  
  1763. >From StevenEllis@microapl.demon.co.uk (Steven Ellis)
  1764. Date: Thu, 30 Jun 1994 10:50:06 GMT
  1765. Organization: MicroAPL
  1766.  
  1767.  
  1768. In article <2usfcd$55p@geraldo.cc.utexas.edu> rick@akbar.cc.utexas.edu (Rick
  1769. Watson) writes:
  1770. >Metrowerks 68k C passes short values on the stack as 16-bit
  1771. >values where MPW uses 32 bits. This causes problems when trying
  1772. >to call MPW generated code modules, including MacTCP's 
  1773. >domain resolver code called by DNR.c. 
  1774. >
  1775. >Is there an easy workaround for this that does NOT involve prototyping
  1776. >the short values as longs? 
  1777.  
  1778. If you look in the compiler preferences there is an option to use 4byte short
  1779. values.
  1780.  
  1781. >
  1782. >Rick Watson 
  1783. >The University of Texas Computation Center, Networking Services, 512/471-8220
  1784. > r.watson@utexas.edu
  1785. >
  1786.  
  1787. Steven Ellis
  1788.  
  1789. +++++++++++++++++++++++++++
  1790.  
  1791. >From johnmce@world.std.com (John McEnerney)
  1792. Date: Fri, 1 Jul 1994 15:23:53 GMT
  1793. Organization: The World Public Access UNIX, Brookline, MA
  1794.  
  1795. creiman@netcom.com (Charlie Reiman) writes:
  1796.  
  1797. >>>>Metrowerks 68k C passes short values on the stack as 16-bit
  1798. >>values where MPW uses 32 bits.
  1799. >>Is there an easy workaround for this that does NOT involve
  1800. >>prototyping
  1801. >>the short values as longs? 
  1802.  
  1803. >Think C has the exact same feature, even with 4 byte ints turned on.  I
  1804. >did call up Symantec tech support and argue about this. I can no longer
  1805. >quote the K&R ANSI page number, but the behavior you are seeing is not
  1806. >incorrect.
  1807. >It's stupid, but not incorrect. 
  1808.  
  1809. Everybody thinks that they're a compiler designer...
  1810.  
  1811. The ANSI standard clarified that when an argument is declared 'float', 
  1812. 'char' or 'short' it does not have to be widened to 'double' or 'int' 
  1813. when passed as an argument. (The only exception is when there is no 
  1814. prototype or for arguments matching the "...") It also clarified that a 
  1815. compiler is not required to pass arguments in reverse order when the 
  1816. number of arguments in known.
  1817.  
  1818. This permits ANSI compilers to generate much better code, in this case 
  1819. avoiding an EXT.W for each argument passed. Some compilers (including 
  1820. Symantec C++ I think) will pass arguments in the order that they are 
  1821. declared and will have the calleee strip the arguments, again contrary to 
  1822. K&R practice, but also usually more efficient.
  1823.  
  1824. I don't see why every compiler for the Mac has to be saddled with the 
  1825. calling conventions of a compiler that Apple hasn't done any work on in 5 
  1826. years.
  1827.  
  1828. -- John McEnerney, Metrowerks PowerPC Product Architect
  1829.  
  1830. +++++++++++++++++++++++++++
  1831.  
  1832. >From Jens Alfke <jens_alfke@powertalk.apple.com>
  1833. Date: Fri, 1 Jul 1994 18:36:29 GMT
  1834. Organization: Apple Computer
  1835.  
  1836. Steven Ellis, StevenEllis@microapl.demon.co.uk writes:
  1837. > If you look in the compiler preferences there is an option to use 4byte
  1838. short
  1839. > values.
  1840.  
  1841. No, there is an option to use 4byte ints. shorts are always two bytes on
  1842. every Mac compiler (and on just about every other C compiler in the world,
  1843. with a few exceptions.) And shorts will always be pushed as 2 bytes by every
  1844. Mac compiler except MPW C.
  1845.  
  1846. I understand that Apple, Symantec and Metrowerks are hammering out a standard
  1847. C calling convention to be used by all their compilers, at least optionally
  1848. via pragmas. This becomes important with CFM and SOM on 68k, where C calling
  1849. conventions are used. (On PPC of course there is already one standard set of
  1850. calling conventions.)
  1851.  
  1852. --Jens Alfke
  1853.   jens_alfke@powertalk              Rebel girl, rebel girl,
  1854.             .apple.com              Rebel girl you are the queen of my world
  1855.  
  1856. +++++++++++++++++++++++++++
  1857.  
  1858. >From creiman@netcom.com (Charlie Reiman)
  1859. Date: Sat, 2 Jul 1994 00:43:50 GMT
  1860. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1861.  
  1862. johnmce@world.std.com (John McEnerney) writes:
  1863.  
  1864. >creiman@netcom.com (Charlie Reiman) writes:
  1865.  
  1866. >>>>>Metrowerks 68k C passes short values on the stack as 16-bit
  1867. >>>values where MPW uses 32 bits.
  1868. >>>Is there an easy workaround for this that does NOT involve
  1869. >>>prototyping
  1870. >>>the short values as longs? 
  1871.  
  1872. >>Think C has the exact same feature, even with 4 byte ints turned on.  I
  1873. >>did call up Symantec tech support and argue about this. I can no longer
  1874. >>quote the K&R ANSI page number, but the behavior you are seeing is not
  1875. >>incorrect.
  1876. >>It's stupid, but not incorrect. 
  1877.  
  1878. >Everybody thinks that they're a compiler designer...
  1879.  
  1880. >The ANSI standard clarified that when an argument is declared 'float', 
  1881. >'char' or 'short' it does not have to be widened to 'double' or 'int' 
  1882. >when passed as an argument. (The only exception is when there is no 
  1883. >prototype or for arguments matching the "...") It also clarified that a 
  1884. >compiler is not required to pass arguments in reverse order when the 
  1885. >number of arguments in known.
  1886.  
  1887. >This permits ANSI compilers to generate much better code, in this case 
  1888. >avoiding an EXT.W for each argument passed. Some compilers (including 
  1889. >Symantec C++ I think) will pass arguments in the order that they are 
  1890. >declared and will have the calleee strip the arguments, again contrary to 
  1891. >K&R practice, but also usually more efficient.
  1892.  
  1893. >I don't see why every compiler for the Mac has to be saddled with the 
  1894. >calling conventions of a compiler that Apple hasn't done any work on in 5 
  1895. >years.
  1896.  
  1897. Don't get me wrong. I understand what you are trying to do. I just
  1898. think the anguish it causes developers isn't worth the win in compiler
  1899. speed. Calling it 'stupid' may have been harsh but you weren't here
  1900. when I had to debug the problem it caused. Nor were you here when I had
  1901. to wedgie protoypes on top of 300,000+ lines of complex cross-platform
  1902. code to avoid future problems.
  1903.  
  1904. I may not be a compiler designer, but I sure do beat the crap out of
  1905. them.  I know what breaks and I simply have to disagree with you.
  1906.  
  1907. -- 
  1908. "You can't cancel the project! We already made the T-shirts!"
  1909. Charlie Reiman
  1910. creiman@netcom.com
  1911.  
  1912. +++++++++++++++++++++++++++
  1913.  
  1914. >From Lars.Farm@nts.mh.se (Lars Farm)
  1915. Date: Sat, 02 Jul 1994 11:56:40 +0100
  1916. Organization: Mid Sweden University
  1917.  
  1918. In article <1994Jul1.183629.27436@gallant.apple.com>, Jens Alfke
  1919. <jens_alfke@powertalk.apple.com> wrote:
  1920.  
  1921. > I understand that Apple, Symantec and Metrowerks are hammering out a standard
  1922. > C calling convention to be used by all their compilers, at least optionally
  1923. > via pragmas. This becomes important with CFM and SOM on 68k, where C calling
  1924. > conventions are used. (On PPC of course there is already one standard set of
  1925. > calling conventions.)
  1926.  
  1927. Isn't this a place for extern "OtherCallingConvention" void foo(int);
  1928. as in extern "C", or extern "MPW", or extern "ASLM", or extern "SOM", or
  1929. extern "CFM", or extern "Pascal", ... leaving internal calling conventions
  1930. as an implementation detail to the specific compiler vendor?
  1931.  
  1932. Instead of #pragmas or worse - project wide preferences.
  1933.  
  1934. Lars
  1935.  
  1936. -- 
  1937. Lars.Farm@nts.mh.se
  1938.  
  1939. ---------------------------
  1940.  
  1941. >From dnebing@bgsu.edu (  Mr. Neb)
  1942. Subject: Special #define for Univ. Hdrs?
  1943. Date: 3 Jul 1994 04:16:21 GMT
  1944. Organization: Bowling Green State University
  1945.  
  1946.   Here's a quicky: I just got done adding Univ. Hdrs. to TC7.0.3
  1947. (headers from develop 18 CD) and started to recompile some existing
  1948. code to see if it would fly without any serious modifications.
  1949.  
  1950.   Everything was going fine until I recompiled a project that was using
  1951. IconFamilies.h (for those of you who don't remember, IconFamilies.h
  1952. was the file defined in TechNote #306, "Drawing Icons the System 7
  1953. Way").  Everything from IconFamilies.h has been shuffled into Icons.h.
  1954.  
  1955.   Hey, that's fine with me.  But I would like to modify my source to
  1956. include IconFamilies.h if the univ. hdrs. are not available.  Easiest
  1957. way to do this, I says to myself, is to surround the #include with
  1958. an #ifndef.  The only problem is that I don't know if there is a
  1959. constant defined so that I can distinguish between the old headers
  1960. and the universal headers.
  1961.  
  1962.   So to wrap up, is there a constant defined somewhere within the
  1963. universal headers?
  1964.  
  1965. ============================================================
  1966. Dave Nebinger                    dnebing@andy.bgsu.edu
  1967. Network Manager, Biology Dept.   dnebing@opie.bgsu.edu
  1968. Bowling Green State University   dnebing@bgsuopie (bitnet)
  1969. Bowling Green, OH 43403          #include <std_disclaimer.h>
  1970.  
  1971.              *THE* alt.sources.mac supporter!
  1972.  
  1973.  
  1974. +++++++++++++++++++++++++++
  1975.  
  1976. >From al@crucible.powertools.com (Al Evans)
  1977. Date: 4 Jul 94 14:31:12 GMT
  1978. Organization: PowerTools, Austin, Texas
  1979.  
  1980. In article <2v5e2l$rm@falcon.bgsu.edu> dnebing@bgsu.edu (  Mr. Neb) writes:
  1981.  
  1982. >  So to wrap up, is there a constant defined somewhere within the
  1983. >universal headers?
  1984.  
  1985. I've been using #ifdef __CONDITIONALMACROS__. As far as I can tell,
  1986. <ConditionalMacros.h> gets included any time you're using the
  1987. universal headers, but doesn't exist if you're not.
  1988.  
  1989.                     --Al Evans--
  1990. -- 
  1991. Al Evans            |   Graphic Elements: A new standard for 
  1992.                 |   high-performance interactive Macintosh graphics.
  1993. al@crucible.powertools.com  |   Available from mac.archive.umich.edu
  1994.                 |   /mac/misc/demo/graphicelementsdemo.sit.hqx
  1995.  
  1996. +++++++++++++++++++++++++++
  1997.  
  1998. >From peter.lewis@info.curtin.edu.au (Peter N Lewis)
  1999. Date: Mon, 04 Jul 1994 10:32:51 +0800
  2000. Organization: NCRPDA, Curtin University
  2001.  
  2002. In article <2v5e2l$rm@falcon.bgsu.edu>, dnebing@bgsu.edu (  Mr. Neb) wrote:
  2003.  
  2004. >  Hey, that's fine with me.  But I would like to modify my source to
  2005. >include IconFamilies.h if the univ. hdrs. are not available.  Easiest
  2006. >way to do this, I says to myself, is to surround the #include with
  2007. >an #ifndef.  The only problem is that I don't know if there is a
  2008. >constant defined so that I can distinguish between the old headers
  2009. >and the universal headers.
  2010.  
  2011. Wow, another few years and this will be almost as much fun as trying to
  2012. get a unix program compiled.
  2013.  
  2014. I just love the C #define, #include method of seperate compilation. 
  2015. Brilian piece of design :-)
  2016.    Peter.
  2017. _______________________________________________________________________
  2018. Peter N Lewis <peter.lewis@info.curtin.edu.au>       Ph: +61 9 368 2055
  2019.  
  2020. ---------------------------
  2021.  
  2022. >From mdtaylor@apple.com (Mark D. Taylor)
  2023. Subject: Why does THINK C use a jump table?
  2024. Date: 17 Jun 1994 10:08:53 -0700
  2025. Organization: Apple Computer Inc, Cupertino, CA
  2026.  
  2027. Or more specifically, why does a call of a function in the same source file
  2028. and segment of the caller go through a jump table?
  2029.  
  2030. I'm having a problem with this because the call occurs at interrupt time
  2031. when A5 is not guaranteed and sometimes the jump table is not where the code
  2032. thinks it should be.
  2033.  
  2034. So what controls whether the jump table is used?  How can I disable it?
  2035.  
  2036. Thanks,
  2037. Mark
  2038.  
  2039.  
  2040. +++++++++++++++++++++++++++
  2041.  
  2042. >From doc@miracle.farallon.com (eric doc kampman)
  2043. Date: Fri, 17 Jun 1994 18:17:52 -0800
  2044. Organization: farallon
  2045.  
  2046. In article <2tslb5$d6c@apple.com>, mdtaylor@apple.com (Mark D. Taylor)
  2047. wrote:
  2048.  
  2049. > Or more specifically, why does a call of a function in the same source file
  2050. > and segment of the caller go through a jump table?
  2051. > I'm having a problem with this because the call occurs at interrupt time
  2052. > when A5 is not guaranteed and sometimes the jump table is not where the code
  2053. > thinks it should be.
  2054. > So what controls whether the jump table is used?  How can I disable it?
  2055.  
  2056. Short answer -- as far as I can tell, when one routine calls another it
  2057. *always* goes through the jump table -- even if the routine you're calling
  2058. is defined in the same source file and is 2 bytes away from the PC.  This
  2059. "feature" has caused me to retreat back to MPW when I'm not doing OOP
  2060. stuff.  You're going to have to save your A5 somewhere you can retrieve it
  2061. when you're not the front app.  There are many different situations where
  2062. this occurs and many ways of handling it.  For a generic solution -- check
  2063. out <SetUpA4.h> (in THINK #includes) for a *very* interesting way of saving
  2064. register values where you can get to them. It takes a little while to see
  2065. why what they're doing works (or at least it did for me).
  2066.  
  2067. -- 
  2068. doc@miracle.farallon.com
  2069. Farallon didn't write this, Farallon isn't responsible for its con-
  2070. tents -- Farallon is an abstract class and cannot be held responsible
  2071. for the quality of instantiations of derived classes.  
  2072. ********************************************************************
  2073.  Look for the thing you can't find/Seeing with eyes makes you blind
  2074.                You know you're out of your mind 
  2075.  
  2076. +++++++++++++++++++++++++++
  2077.  
  2078. >From siegel@netcom.com (Rich Siegel)
  2079. Date: Sat, 18 Jun 1994 01:20:21 GMT
  2080. Organization: Bare Bones Software
  2081.  
  2082. In article <2tslb5$d6c@apple.com> mdtaylor@apple.com (Mark D. Taylor) writes:
  2083. >Or more specifically, why does a call of a function in the same source file
  2084. >and segment of the caller go through a jump table?
  2085.  
  2086. (one of) Two reasons: it's not declared 'static', and/or you take its
  2087. address at some point in the code. If it's not declared static, it
  2088. needs to be accessible through the jump table so that other functions
  2089. can call it. If you take its address, it has to be indirected thruogh
  2090. the jump table to ensure position independence.
  2091.  
  2092. R.
  2093.  
  2094.  
  2095.  
  2096. -- 
  2097. Rich Siegel % siegel@netcom.com    % Principal, Bare Bones Software
  2098. --> For information about BBEdit, finger bbedit@world.std.com <--
  2099.  
  2100. "...yeah, I inhaled, and then I drank the bong water. So what're
  2101. you gonna do about it?" - Dennis Miller, on Bill Clinton
  2102.  
  2103. +++++++++++++++++++++++++++
  2104.  
  2105. >From gurgle@netcom.com (Pete Gontier)
  2106. Date: Sat, 18 Jun 1994 05:00:40 GMT
  2107. Organization: cellular
  2108.  
  2109. mdtaylor@apple.com (Mark D. Taylor) writes:
  2110.  
  2111. >Or more specifically, why does a call of a function in the same source
  2112. >file and segment of the caller go through a jump table? I'm having a
  2113. >problem with this because the call occurs at interrupt time when A5
  2114. >is not guaranteed and sometimes the jump table is not where the code
  2115. >thinks it should be. So what controls whether the jump table is used?
  2116. >How can I disable it?
  2117.  
  2118. You can't disable it without using another compiler, but you can make
  2119. sure your interrupt code works. First make sure the segment in question
  2120. is loaded by doing some work at non-interrupt time. Make a call into
  2121. the segment, perhaps to a dummy routine which exists solely to force
  2122. the segment to load. Make sure you don't subsequently call UnloadSeg
  2123. for that segment. Then, in your interrupt code, make sure A5 is set up
  2124. properly before you make the interrupt-time call into the segment. I
  2125. believe you will find relevant documentation in the usual places under
  2126. 'SetCurrentA5'.
  2127.  
  2128. None of this stuff is relevant under PowerPC, of course.
  2129. -- 
  2130.  Pete Gontier, CTO, Integer Poet Software; gurgle@netcom.com
  2131.  
  2132.  'It seems the firm contracted by Intel to produce the famed "flying
  2133.  Pentium" ads could not complete the 3-D modeling on a PC before
  2134.  deadline. So in the best know-your-enemy tradition, they chose the next
  2135.  best thing -- a Quadra 840AV.'                 -- Mac The Knife 4/18/94
  2136.  
  2137. +++++++++++++++++++++++++++
  2138.  
  2139. >From gurgle@netcom.com (Pete Gontier)
  2140. Date: Sat, 18 Jun 1994 17:26:11 GMT
  2141. Organization: cellular
  2142.  
  2143. mdtaylor@apple.com (Mark D. Taylor) writes:
  2144.  
  2145. >Or more specifically, why does a call of a function in the same source
  2146. >file and segment of the caller go through a jump table?
  2147.  
  2148. Rich posted the reasons why, and I posted a way for you to make your
  2149. interrupt code work. But I don't think anybody yet has specifically
  2150. talked about the general case of how to make jump table entries go away.
  2151. If your routine is declared 'static' and you don't take its address,
  2152. *that* will guarantee it will not generate a jump table entry. (If your
  2153. routine is only referenced from its own segment, it will not generate a
  2154. jump table entry when building a stand-alone app, but it's more common
  2155. for programmers to want to run their app from TPM.)
  2156.  
  2157. This gives me an opportunity to be even a little more pedantic.
  2158.  
  2159. THINK C supports a language extension "require prototypes". Most people
  2160. should have it turned on (in the project settings dialog), because it
  2161. only helps you build safer and stronger software at the expense of some
  2162. extra typing sometimes. But most people don't know how to take advantage
  2163. of it. They turn it on, and the compiler encounters a function like
  2164. 'foo':
  2165.  
  2166.     void foo (void) { }
  2167.     void main (void) { foo ( ); }
  2168.  
  2169. ...and of course the compiler complains because there is no prototype
  2170. for 'foo' in scope. People's response is generally to give the compiler
  2171. a prototype, even for routines which will never be called from another
  2172. module:
  2173.  
  2174.     void foo (void);
  2175.         void foo (void) { }
  2176.         void main (void) { foo ( ); }
  2177.  
  2178. ...and this makes the compiler shut up. But there is a much better way:
  2179.  
  2180.     static void foo (void) { }
  2181.         void main (void) { foo ( ); }
  2182.  
  2183. ...this not only makes the compiler shut up, but it prevents 'foo'
  2184. from requiring a jump table entry, as long as you don't also take its
  2185. address. This not only keeps your jump-table less crowded, but it also
  2186. relieves you of having to deal with the possibility that A5 (or A4 in
  2187. some cases) is not valid when 'foo' is called. (If 'foo' is going to
  2188. call other routines which rely on A5 (or A4), 'foo' still needs to make
  2189. sure A5 (or A4) is valied before calling those other routines.)
  2190.  
  2191. Now, some people will say that relying on this behavior is a bad idea,
  2192. because the ANSI standard doesn't specify that 'static' should have
  2193. this effect. However, neither does the ANSI standard specify that a
  2194. feature like "require prototypes" be supported. When you hit the "ANSI
  2195. settings" button in the prefs dialog, notice that "infer prototypes"
  2196. gets selected, not "require prototypes". So since "require prototypes"
  2197. isn't ANSI in the first place, you might as well rely on the 'static'
  2198. keyword to help you use "require prototypes". I know CodeWarrior
  2199. supports it, by the way, and I suspect MPW C supports it in some similar
  2200. fashion, as well.
  2201.  
  2202. The reason I really like to use the 'static' keyword in this way is the
  2203. way THINK C segmentation works. You can only control segmentation at the
  2204. module level, so by definition 'static' routines cannot be called from
  2205. another segment. The linker simply won't cooperate. Using the 'static'
  2206. keyword in this way can prevent a whole layer of mistakes before they
  2207. require debugging time.
  2208. -- 
  2209.  Pete Gontier, CTO, Integer Poet Software; gurgle@netcom.com
  2210.  
  2211.  You thought Obfuscated C was confusing? Wait for Obfuscated C++!
  2212.  
  2213. +++++++++++++++++++++++++++
  2214.  
  2215. >From ari@world.std.com (Ari I Halberstadt)
  2216. Date: Mon, 20 Jun 1994 04:47:12 GMT
  2217. Organization: The World Public Access UNIX, Brookline, MA
  2218.  
  2219. In article <gurgleCrLsFo.3Hy@netcom.com>,
  2220. Pete Gontier <gurgle@netcom.com> wrote:
  2221. >...
  2222. >The reason I really like to use the 'static' keyword in this way is the
  2223. >way THINK C segmentation works. You can only control segmentation at the
  2224. >module level, so by definition 'static' routines cannot be called from
  2225. >another segment. The linker simply won't cooperate. Using the 'static'
  2226. >keyword in this way can prevent a whole layer of mistakes before they
  2227. >require debugging time.
  2228.  
  2229. There's another good reason to use this feature. It saves you from
  2230. having to put prototypes into the file, which means a bit less work
  2231. for the programmer/maintainer. It also helps give some logical
  2232. structure to your source files, since static functions need to be
  2233. defined before you can use them. If you really need to use a function
  2234. before it's defined, you can place a prototype for that function near
  2235. the head of the source file.
  2236. -- 
  2237. Ari Halberstadt                                 ari@world.std.com
  2238. One generation passes away, and another generation comes: but the
  2239. earth abides for ever. -- Ecclesiastes, 1:4.
  2240.  
  2241. +++++++++++++++++++++++++++
  2242.  
  2243. >From Aaron Wohl <aw0g+@andrew.cmu.edu>
  2244. Date: Fri,  1 Jul 1994 09:12:14 -0400
  2245. Organization: Systems Group 97, Carnegie Mellon, Pittsburgh, PA
  2246.  
  2247. There are two ways around think c using A5 to make calls:
  2248.  
  2249. a) have an lea instruction at the start of the routine (use asm {}) and
  2250. patch it before using the address at interrupt time.  (then flush the
  2251. code caches)
  2252.  
  2253. b) Compile the code in question as a code resource and load the resource.
  2254.  
  2255. See the code samples on akutaktak.andrew.cmu.edu [128.2.35.1] in the
  2256. /aw0g directory for some examples of using code resources.
  2257.  
  2258.  
  2259. ---------------------------
  2260.  
  2261. End of C.S.M.P. Digest
  2262. **********************
  2263.  
  2264.  
  2265.